/** ================================================================================================================ **/
/**    Funzioni di utilità per determinare e manipolare lo stile delle feature	in Mappa.jsp e le Anagrafiche. 		 **/
/** ================================================================================================================ **/

BootApplication.service("TemplateStyles", [ "olStyleService", "configuration", "olFeatureService", "olFormatService","MonitoraggioTplSrv",
                                            function( olStyleService, configuration, olFeatureService, olFormatService,MonitoraggioTplSrv ) {

	var SUFFIX_COPY = "_copy";
	/**
	 * Il minimo zoom entro il quale una feature lineare o poligonare deve avere anche l'iconografia del punto
	 */
	var MIN_ZOOM = configuration.getParam("Constants").MIN_ZOOM;
	/**
	 * Il massimo zoom entro il quale una feature lineare o poligonare deve avere anche l'iconografia del punto
	 */
	var MAX_ZOOM = configuration.getParam("Constants").MAX_ZOOM;
	
	
	/**
	 * Data la feature restituisce lo stile che la rappresenta.
	 * Lo stile è determinato dal layer(codice layer) a cui la feature è aggiunta. Inoltre, quando la feature ha una rappresentazione 
	 * geometrica del tipo area o linea, viene gestita una feature clone della prima la cui rappresentazione geometrica però, è del tipo
	 * punto.
	 * Di modo che a uno zoom alto, vediamo questo punto che ci segnala l'entità. Man man che con lo zoom ci avviciniamo al punto vedremo sia 
	 * il punto che la geometria originale, per poi finire col vedere solo la geometria originale.
	 * 
	 * NOTA: Per funzionare correttamente tra le properties della feature ci deve essere un campo che la identifica univocamente rispetto 
	 *       le altre. Il campo scleto è l'id, quindi tra gli attributi delle properties deve esserci l'id è l'attributo deve chiamarsi "id".
	 * 
	 * @param {@link ol.Map} map
	 * @param {@link ol.Feature} feature
	 * 
	 * Returns:  
	 * 	  {@link ol.style.Style} Style.
	 */
	this.findStyleByCodeLayer = function (map, feature){
		 
		/* Find layer associato alla feature */
		var layer = feature.getLayer(map);
		/* Find codice del layer */
		var codeLayer = (angular.isDefined(layer) && layer != null) ? layer.getName() : null;
		
		/* Get zoom corrente */
		var zoom = map.getView().getZoom();
		/* Get max zoom */
		var maxzoom = map.getOptions().getMaxZoom();
		/* Get min zoom */
		var minzoom = map.getOptions().getMinZoom();
		
		/* Get property feature */
		var properties = feature.getProperties();
		/* 
		 * Get the feature identifier. This is a stable identifier for the feature and is either set when reading data from a remote source or 
		 * set explicitly by calling ol.Feature#setId.
		 */
		var featureId = feature.getId();
		
		if(angular.isUndefined(featureId) || featureId == null) {
			feature.setId(properties.id + "");
			featureId = feature.getId();
		}
		
		/* Stile della feature da ritornare */
		var style = null;
		
		if(layer != null && codeLayer != null){
			
			if(zoom >= MIN_ZOOM && zoom <= MAX_ZOOM){
				/* Caso in cui lo stile deve essere un icona, se la geometria della feature è diversa da un ol.geom.Point/ol.geom.MultiPoint */
				
				/*
				 * A questo livello devo controllare solo il seguente caso : la feature è l'originale non la copia e la geometria 
				 * è una linea o un poligono.
				 * Se la geometria è un punto, lo stile che dopo andrò a determinare è proprio quello della feature.
				 * Se la feature è una copia, vuol dire che la sua geometria è un punto e quindi ricade nel caso precedente.   
				 */
				
				/*
				 * Gestione caso in cui la feature è l'originale non la copia e la geometria è una linea o un poligono.
				 * Devo quindi creare una copia speculare della feature, cambiando però :
				 *   - la geometria: che deve esse puntuale, per default il centroid della stessa
				 *   - lo stile: quello impostato per la geometria puntuale
				 */
				if(!(feature.getGeometry() instanceof ol.geom.Point) && !(feature.getGeometry() instanceof ol.geom.MultiPoint) && 
						featureId.indexOf(SUFFIX_COPY) == -1)	{
					
					/* Punto centrale alla geometria originale */
					var centroid = olFeatureService.getCentroidGeometry(feature.getGeometry());
					
					/* Clone this feature. If the original feature has a geometry it is also cloned. The feature id is not set in the clone. */
					var featureClone = feature.clone();
						/* Set the feature id.  The feature id can be used with the ol.source.Vector#getFeatureById method. */
						featureClone.setId(properties.id + SUFFIX_COPY);
						/* Set the default geometry for the feature */
						featureClone.setGeometry(olFormatService.olCoordinateToPoint(centroid, configuration.getParam("ol.geom.GeometryLayout").XY));
						
					/* Add a single feature to the source */
					layer.getSource().addFeature(featureClone);
				}				
			}else{
				/* Caso in cui lo stile deve essere proprio quello stabilito per la feature */
	
				/* Controllo se al layer è stata aggiunta eventuale copia, se si devo rimuoverla */
				var fea = layer.getSource().getFeatureById(properties.id + SUFFIX_COPY);
				/* Rimuovo la singola feature dal source. */
				if(angular.isDefined(fea) && fea != null ) layer.getSource().removeFeature(fea);
			}
			
			/* Determino lo stile della feature da usare a questo livello di zoom */
			style = detectStyle(codeLayer, feature.getGeometry().getType(), properties, zoom);
		
		}// close if codeLayer != null
		
		/* refresh size map */
		map.updateSize();
		
		return style;
	}// findStyleByCodeLayer
	
	
	/**
	 * Data la feature restituisce lo stile che la rappresenta quando viene selezionata o quando ci si passa sopra col mouse.
	 * Lo stile è determinato dal layer(codice layer) a cui la feature è aggiunta. 
	 * 
	 * @param {@link ol.Map} map
	 * @param {@link ol.Feature} feature
	 * 
	 * Returns:  
	 * 	  {@link ol.style.Style} Style.
	 */
	this.findStyleHighlightSelectByCodeLayer = function (map, feature){
		
		/* Find layer associato alla feature */
		var layer = feature.getLayer(map);
		/* Find codice del layer */
		var codeLayer = (angular.isDefined(layer) && layer != null) ? layer.getName() : null;
		
		/* Get zoom corrente */
		var zoom = map.getView().getZoom();
		/* Get max zoom */
		var maxzoom = map.getOptions().getMaxZoom();
		/* Get min zoom */
		var minzoom = map.getOptions().getMinZoom();
		
		/* Get property feature */
		var properties = feature.getProperties();
		
		/* Stile della feature da ritornare */
		var style = null;
		
		if(layer != null && codeLayer != null){
			/* Determino lo stile della feature da usare a questo livello di zoom */
			style = detectStyle(codeLayer, feature.getGeometry().getType(), properties, zoom);
		}// close if codeLayer != null
		
		/* resize map */
		map.updateSize();
		
		return style;
	}// findStyleHighlightSelectByCodeLayer
	
	
	/**
	 * 
	 */
	function detectStyle(codeLayer, geometryType, properties, zoom){
		var style = null;
		switch (codeLayer) {
			/** ANAGRAFICA ZTL */
			case configuration.getParam("Constants").layersName["ZONE_TRAFFICO_LIMITATO"]: {
			    	
				switch (geometryType) {
				    case "Point": case "MultiPoint":{
				    	style = 
				    		new ol.style.Style({
							 	image: olStyleService.createOlStyleIcon(
							 				configuration.getParam("Constants").ContextPath + 
							 				configuration.getParam("Constants").iconStyles[codeLayer], [30, 30]),
							 	zIndex: 2
				    		});
				    	break;
				    }
				    case "Polygon": case "MultiPolygon": default: {
				    	style = 
				    		new ol.style.Style({
				    			fill: new ol.style.Fill({ color: 'rgba(195, 216, 255, 0.5)' }),
								stroke: new ol.style.Stroke({ color: '#00507C', width: 2 }),
								zIndex: 1
							});
				        break; 
				    }
				}
			    break;
			}// close ZONE_TRAFFICO_LIMITATO
			
			/** PISTE CICLABILI **/
			case configuration.getParam("Constants").layersName["PISTE_CICLABILI"]: {
				
				switch (geometryType) {
				    case "Point": case "MultiPoint":{
				    	style = 
				    		new ol.style.Style({
							 	image: olStyleService.createOlStyleIcon(
							 				configuration.getParam("Constants").ContextPath + 
							 				configuration.getParam("Constants").iconStyles[codeLayer], [30, 30]),
							 	zIndex: 2
				    		});
				    	break;
				    }
				    case "LineString": case "MultiLineString": default: {
				    	style = 
				    		new ol.style.Style({
				    			 stroke: new ol.style.Stroke({ color: '#176BE9', width: 3 }),
				    			 zIndex: 1
							});
				        break; 
				    }
				}
				break;
			}// close PISTE_CICLABILI
			
			/** AREE PEDONALI */
			case configuration.getParam("Constants").layersName["AREE_PEDONALI"]: {
				
				switch (geometryType) {
				    case "Point": case "MultiPoint":{
				    	style = 
				    		new ol.style.Style({
							 	image: olStyleService.createOlStyleIcon(
							 				configuration.getParam("Constants").ContextPath + 
							 				configuration.getParam("Constants").iconStyles[codeLayer], [30, 30]),
							 	zIndex: 2
				    		});
				    	break;
				    }
				    case "Polygon": case "MultiPolygon": default: {
				    	style = 
				    		new ol.style.Style({
								fill: new ol.style.Fill({ color: 'rgba(204, 255, 170, 0.5)' }),
								stroke: new ol.style.Stroke({ color: '#006D15', width: 2 }),
								zIndex: 1
							});
				        break; 
				    }
				}
				break;
			}// close AREE_PEDONALI
			
			/** PARCHEGGI : ANAGRAFICA **/
			case configuration.getParam("Constants").layersName["PARCHEGGI"]: {
				
				switch (geometryType) {
				    case "Point": case "MultiPoint":{
				    	style = 
				    		new ol.style.Style({
							 	image: olStyleService.createOlStyleIcon(configuration.getParam("Constants").ContextPath + 
							 		   configuration.getParam("Constants").iconStyles[codeLayer], [30, 30]),
								zIndex: 2
				    		});
				    	break;
				    }
				    case "Polygon": case "MultiPolygon": default: {
				    	style = 
							new ol.style.Style({
								fill: new ol.style.Fill({ color: 'rgba(195, 216, 255, 0.5)' }),
								stroke: new ol.style.Stroke({ color: '#132FC3', width: 2 }),
								zIndex: 1
							});
				        break; 
				    }
				}
				break;
			}// close
			
			/** PARCHEGGI : MONITORAGGIO **/
			case configuration.getParam("Constants").layersName["PARCHEGGI_MONITORAGGIO"]: {
				/**
				 * Lo stile della feature prevede anche la label dove l'informazione mostrata è il relatime dei posti disponibili.
				 * Il colore dell'icona cambia a seconda se il numero posti cade in un range piuttosto che un'altro.
				 * I range sono :
				 *  - value <= di 5: rosso
				 *  - value >= 5 e value <= totPosti/2: arancione
				 *  - value maggiore della meta dei posti : verde 
				 */
				var ico = properties.postiRealtime <= 5 ? configuration.getParam("Constants").iconStyles[codeLayer]["BASSA"] : 
		    			  (properties.postiRealtime >= 5 && properties.postiRealtime <= (properties.postiDisponibili/2)) ? configuration.getParam("Constants").iconStyles[codeLayer]["MEDIA"] : 
		    			  configuration.getParam("Constants").iconStyles[codeLayer]["ALTA"];
				
				var text = new ol.style.Text(({
					   /* */
					   font: 'bold 14px sans-serif',
					   /* Text content. */
					   text: properties.postiRealtime,
					   /* Text alignment. Possible values: 'left', 'right', 'center', 'end' or 'start'. Default is 'start'. */
					   textAlign: "center",
					   /* Text base line. Possible values: 'bottom', 'top', 'middle', 'alphabetic', 'hanging', 'ideographic'. Default is 'alphabetic'. */
					   textBaseline: "bottom",
					   /* 
					    * Fill style. If none is provided, we'll use a dark fill-style (#333).
					    * A color represented as a short array [red, green, blue, alpha]. red, green, and blue should be integers in the range 0..255 
					    * inclusive. alpha should be a float in the range 0..1 inclusive. If no alpha value is given then 1 will be used.
					    */
					   fill: new ol.style.Fill({ color: (zoom >= MIN_ZOOM && zoom <= MAX_ZOOM) ? "black" : "black" })
				}));
				
				switch (geometryType) {
				    case "Point": case "MultiPoint":{
				    	style = 
				    		new ol.style.Style({
							 	image: olStyleService.createOlStyleIcon(configuration.getParam("Constants").ContextPath + ico, [30, 30]),
								text: text, zIndex: 2
				    		});
				    	break;
				    }
				    case "Polygon": case "MultiPolygon": default: {
				    	style = 
							new ol.style.Style({
								fill: new ol.style.Fill({ color: 'rgba(195, 216, 255, 0.5)' }),
								stroke: new ol.style.Stroke({ color: '#132FC3', width: 2 }),
								text: (zoom >= MIN_ZOOM && zoom <= MAX_ZOOM) ? null : text, zIndex: 1
							});
				        break; 
				    }
				}
				break;
			}// close 
			
			/** BIKE SHARING : ANAGRAFICA */
			case configuration.getParam("Constants").layersName["BIKE_SHARING"]: {
				
				switch (geometryType) {
				    case "Point": case "MultiPoint": {
				    	
				    	style = 
				    		new ol.style.Style({
							 	image: olStyleService.createOlStyleIcon(configuration.getParam("Constants").ContextPath + 
							 		   configuration.getParam("Constants").iconStyles[codeLayer], [30, 30]),
								zIndex: 2
				    		});
				    	
				    	break;
				    }
				}
				break;
			}// close 
			
			/** BIKE SHARING : MONITORAGGIO */
			case configuration.getParam("Constants").layersName["BIKE_SHARING_MONITORAGGIO"]: {
					
				/**
				 * Lo stile della feature prevede anche la label dove l'informazione mostrata è il relatime delle bici disponibili.
				 * Il colore dell'icona cambia a seconda se il numero posti cade in un range piuttosto che un'altro.
				 * I range sono :
				 *  - value <= di 5: rosso
				 *  - value >= 5 e value <= totStalli/2: arancione
				 *  - value maggiore della meta degli stalli : verde 
				 */
				var ico = properties.datiDisponibilita.biciDisponibili <= 5 ? configuration.getParam("Constants").iconStyles[codeLayer]["BASSA"] : 
		    			  (properties.datiDisponibilita.biciDisponibili >= 5 && properties.datiDisponibilita.biciDisponibili <= (properties.datiDisponibilita.stalliTotali/2)) ? configuration.getParam("Constants").iconStyles[codeLayer]["MEDIA"] : 
		    			  configuration.getParam("Constants").iconStyles[codeLayer]["ALTA"];
				
				var text = new ol.style.Text(({
					   /* */
					   font: 'bold 14px sans-serif',
					   /* Text content. */
					   text: properties.datiDisponibilita.biciDisponibili + "",
					   /* Text alignment. Possible values: 'left', 'right', 'center', 'end' or 'start'. Default is 'start'. */
					   textAlign: "left",
					   /* Text base line. Possible values: 'bottom', 'top', 'middle', 'alphabetic', 'hanging', 'ideographic'. Default is 'alphabetic'. */
					   textBaseline: "bottom",
					   /* 
					    * Fill style. If none is provided, we'll use a dark fill-style (#333).
					    * A color represented as a short array [red, green, blue, alpha]. red, green, and blue should be integers in the range 0..255 
					    * inclusive. alpha should be a float in the range 0..1 inclusive. If no alpha value is given then 1 will be used.
					    */
					   fill: new ol.style.Fill({ color: (zoom >= MIN_ZOOM && zoom <= MAX_ZOOM) ? "black" : "black" })
				}));
				
				switch (geometryType) {
				    case "Point": case "MultiPoint": {
				    	
				    	style = 
				    		new ol.style.Style({
							 	image: olStyleService.createOlStyleIcon(configuration.getParam("Constants").ContextPath + ico, [30, 30]),
								text: text, zIndex: 2
				    		});
				    	
				    	break;
				    }
				}
				break;
			}// close 
			
			/** CAR SHARING: AGENZIE **/
			case configuration.getParam("Constants").layersName["CAR_SHARING_AGENZIE"]: {
				
				switch (geometryType) {
				    case "Point": case "MultiPoint":{
				    	style = 
				    		new ol.style.Style({
							 	image: olStyleService.createOlStyleIcon(
							 				configuration.getParam("Constants").ContextPath + 
							 				configuration.getParam("Constants").iconStyles[codeLayer], [30, 30]),
							 	zIndex: 2
				    		});
				    	
				    	break;
				    }
				    case "Polygon": case "MultiPolygon": default: {
				    	style = new ol.style.Style({
					    			stroke: new ol.style.Stroke({ color: 'rgba(139, 91, 4, 0.5)', width: 3 }),
					    			zIndex: 1
					    		});
				        break; 
				    }
				}
				break;
			}// close 
			
			/** CAR SHARING: STAZIONI **/
			case configuration.getParam("Constants").layersName["CAR_SHARING_STATION"]: {
				
				switch (geometryType) {
				    case "Point": case "MultiPoint":{
				    	style = 
				    		new ol.style.Style({
							 	image: olStyleService.createOlStyleIcon(
							 				configuration.getParam("Constants").ContextPath + 
							 				configuration.getParam("Constants").iconStyles[codeLayer], [30, 30]),
							 	zIndex: 2
				    		});
				    	
				    	break;
				    }
				}
				break;
			}// close 
			
			/** CAR SHARING: VEICOLI **/
			case configuration.getParam("Constants").layersName["CAR_SHARING_VEHICLE"]: {
					
				switch (geometryType) {
				    case "Point": case "MultiPoint": {
				    	
				    	style = 
				    		new ol.style.Style({
							 	image: olStyleService.createOlStyleIcon(configuration.getParam("Constants").iconStyles[codeLayer], [30, 30]),
							 	zIndex: 2
				    		});
				    	
				    	break;
				    }
				}
				break;
			}// close 
			
			/** CAR SHARING: VEICOLI - MONITORAGGIO **/
			case configuration.getParam("Constants").layersName["CAR_SHARING_VEHICLE_MONITORAGGIO"]: {
					
				switch (geometryType) {
				    case "Point": case "MultiPoint": {
				    	
				    	style = 
				    		new ol.style.Style({
							 	image: olStyleService.createOlStyleIcon(configuration.getParam("Constants").iconStyles[codeLayer], [30, 30]),
							 	zIndex: 2
				    		});
				    	
				    	break;
				    }
				}
				break;
			}// close 
			
			/** AREE DI SOSTA **/
			case configuration.getParam("Constants").layersName["AREE_DI_SOSTA"]: {
					
				switch (geometryType) {
				    case "Point": case "MultiPoint": {
				    	style = 
				    		new ol.style.Style({
							 	image: olStyleService.createOlStyleIcon(configuration.getParam("Constants").iconStyles[codeLayer], [30, 30]),
							 	zIndex: 2
				    		});
				    	break;
				    }
				    case "Polygon": case "MultiPolygon": default: {
				    	style = 
							new ol.style.Style({
								fill: new ol.style.Fill({ color: 'rgba(50, 135, 240, 0.5)' }),
								stroke: new ol.style.Stroke({ color: '#0065e2', width: 2 }),
								zIndex: 1
							});
				        break; 
				    }
				}
				break;
			}// close
			
			/** PARCOMETRI **/
			case configuration.getParam("Constants").layersName["PARCOMETRI"]: {
					
				switch (geometryType) {
				    case "Point": case "MultiPoint": {
				    	style = 
				    		new ol.style.Style({
							 	image: olStyleService.createOlStyleIcon(configuration.getParam("Constants").iconStyles[codeLayer], [30, 30]),
							 	zIndex: 2
				    		});
				    	break;
				    }
				}
				break;
			}// close
			
			/** TELECAMERE **/
			case configuration.getParam("Constants").layersName["TELECAMERE"]: {
					
				switch (geometryType) {
				    case "Point": case "MultiPoint": {
						/**
						 * Lo stile della feature prevede che l'icona cambi a seconda se la telecamera è attiva o meno.
						 * Valori possibili dello stato:
						 *  - 0: non attiva
						 *  - 1: attiva
						 * Se il valore dello stato non pè determinato uso un'icona di default.
						 */
						var ico = (angular.isDefined(properties.stato) && properties.stato == 0) ? configuration.getParam("Constants").iconStyles[codeLayer]["OFF"] : 
							      (angular.isDefined(properties.stato) && properties.stato == 1) ? configuration.getParam("Constants").iconStyles[codeLayer]["ON"] :
							      configuration.getParam("Constants").iconStyles[codeLayer]["DEFAULT"];
				    			
				    	style = 
				    		new ol.style.Style({
							 	image: olStyleService.createOlStyleIcon(configuration.getParam("Constants").ContextPath + ico, [30, 30]),
							 	zIndex: 2
				    		});
				    	break;
				    }
				}
				break;
			}// close
			
			/** RILEVATORI D'INFRAZIONE **/
			case configuration.getParam("Constants").layersName["RILEVATORI_INFRAZIONE"]: {
					
				switch (geometryType) {
				    case "Point": case "MultiPoint": {
				    	style = 
				    		new ol.style.Style({
							 	image: olStyleService.createOlStyleIcon(configuration.getParam("Constants").iconStyles[codeLayer], [30, 30]),
							 	zIndex: 2
				    		});
				    	break;
				    }
				}
				break;
			}// close
			
			/** SEMAFORI: Anagrafica **/
			case configuration.getParam("Constants").layersName["SEMAFORI"]: {
					
				switch (geometryType) {
				    case "Point": case "MultiPoint": {
				    	style = 
				    		new ol.style.Style({
							 	image: olStyleService.createOlStyleIcon(configuration.getParam("Constants").iconStyles[codeLayer], [30, 30]),
							 	zIndex: 2
				    		});
				    	break;
				    }
				}
				break;
			}// close
			
			/** OBU : MONITORAGGIO **/
			case configuration.getParam("Constants").layersName["OBU_MONITORAGGIO"]: {
				switch (geometryType) {
				    case "Point": case "MultiPoint":{
				    	style = 
				    		new ol.style.Style({
							 	image: olStyleService.createOlStyleIcon(configuration.getParam("Constants").iconStyles[codeLayer], [30, 30]),
								text: text, zIndex: 2
				    		});
				    	break;
				    }
				}
				break;
			}// close 
			
			/** SPIRE: ANAGRAFICA **/
			case configuration.getParam("Constants").layersName["SPIRE"]: {
					
				switch (geometryType) {
				    case "Point": case "MultiPoint": {
				    	style = 
				    		new ol.style.Style({
							 	image: olStyleService.createOlStyleIcon(configuration.getParam("Constants").iconStyles[codeLayer], [30, 30]),
							 	zIndex: 2
				    		});
				    	break;
				    }
				}
				break;
			}// close
			
			/** SPIRE: MONITORAGGIO **/
			case configuration.getParam("Constants").layersName["SPIRE_MONITORAGGIO"]: {
					
				switch (geometryType) {
				    case "Point": case "MultiPoint": {
				    	style = 
				    		new ol.style.Style({
							 	image: olStyleService.createOlStyleIcon(configuration.getParam("Constants").iconStyles[codeLayer], [30, 30]),
							 	zIndex: 2
				    		});
				    	break;
				    }
				}
				break;
			}// close
			
			
			/** TPL STAZIONI **/
			case configuration.getParam("Constants").layersName["TPL_STAZIONI"]: {
				switch (geometryType) {
					case "Point": case "MultiPoint":{
				    	style = 
				    		new ol.style.Style({
							 	image: olStyleService.createOlStyleIcon(
							 				configuration.getParam("Constants").ContextPath + 
							 				configuration.getParam("Constants").iconStyles[codeLayer], [30, 30]),
							 	zIndex: 2
				    		});
				    	break;
				    }
				}
				break;
			}// close
			
			/** TPL LINEE **/
			case configuration.getParam("Constants").layersName["TPL_LINEE"]: {
				
				switch (geometryType) {
				    case "Point": case "MultiPoint":{
				    	style = 
				    		new ol.style.Style({
							 	image: olStyleService.createOlStyleIcon(
							 				configuration.getParam("Constants").ContextPath + 
							 				configuration.getParam("Constants").iconStyles[codeLayer], [30, 30]),
							 	zIndex: 2
				    		});
				    	break;
				    }
				    case "LineString": case "MultiLineString": default: {
				    	style = 
				    		new ol.style.Style({
				    			 stroke: new ol.style.Stroke({ color: '#176BE9', width: 3 }),
				    			 zIndex: 1
							});
				        break; 
				    }
				}
				break;
			}// close TPL_LINEE
			/** ANAGRAFICA REGOLE**/
			case configuration.getParam("Constants").layersName["ANAGRAFICAREGOLE"]: {
				
				switch (geometryType) {
				    case "Point": case "MultiPoint": {
				    	style = 
				    		new ol.style.Style({
				    			image: new ol.style.Circle({radius: 4,
				    				fill: new ol.style.Fill ({ color: 'rgba(195, 216, 255, 0.5)' }),
				    				stroke: new ol.style.Stroke({ color: '#132FC3', width: 2 })
				    			}),
				    			zIndex: 2
				    		});
				    	break;
				    }
				    case "Polygon": case "MultiPolygon": default: {
				    	style = 
							new ol.style.Style({
								fill: new ol.style.Fill({ color: 'rgba(195, 216, 255, 0.5)' }),
								stroke: new ol.style.Stroke({ color: '#132FC3', width: 2 }),
								zIndex: 2
							});
				        break; 
				    }
				}
				break;
			}// close

			/** RICERCA_NOTIFICHE**/
			case configuration.getParam("Constants").layersName["RICERCA_NOTIFICHE"]: {
				_isAlert = properties.isAlert;
				_type = properties.type;
				if(_isAlert == false){
					style = new ol.style.Style({fill  : new ol.style.Fill  ({ color: 'rgba(124, 22, 0, 0.4)'})
							                  ,stroke: new ol.style.Stroke({ color: '#7C1600', width: 2 })
							                  ,zIndex: 2
						                      });
				}else{
					switch (_type) {
					case configuration.getParam("Constants").TIPO_ALERT_SEMAFORO_GUASTO:
					case configuration.getParam("Constants").TIPO_ALERT_SEMAFORO_RIPARATO:
						_image = olStyleService.createOlStyleIcon(configuration.getParam("Constants").ContextPath + '/app/shared/layer_marker_icon/m_semafori_square.png'
                                                                 ,[30, 30]
                                                                 );
						break;
					case configuration.getParam("Constants").TIPO_ALERT_INCENDIO:
					case configuration.getParam("Constants").TIPO_ALERT_TERMINE_INCENDIO:
						_image = olStyleService.createOlStyleIcon(configuration.getParam("Constants").ContextPath + '/app/shared/layer_marker_icon/m_fire-station.png'
								                                 ,[30, 30]
						                                         );
						break;
					case configuration.getParam("Constants").TIPO_ALERT_DISTANZA_PUNTO_FISSO:
					case configuration.getParam("Constants").TIPO_ALERT_AREA_PROTETTA:
						_image = olStyleService.createOlStyleIcon(configuration.getParam("Constants").ContextPath + '/app/shared/layer_marker_icon/m_car.png'
								                                 ,[30, 30]
						                                         );
						break;
					case configuration.getParam("Constants").TIPO_ALERT_ARMA_DA_FUOCO:
						_image = olStyleService.createOlStyleIcon(configuration.getParam("Constants").ContextPath + '/app/shared/layer_marker_icon/m_danger.png'
								                                 ,[30, 30]
						                                         );
						break;
					case configuration.getParam("Constants").TIPO_ALERT_RITARDO:
						_image = olStyleService.createOlStyleIcon(configuration.getParam("Constants").ContextPath + '/app/shared/layer_marker_icon/m_bus.png'
								                                 ,[30, 30]
						                                          );
						break;

					default:
						_image = new ol.style.Circle({radius: 4
                                                     ,fill  : new ol.style.Fill  ({ color: '#132FC3'})
                                                     ,stroke: new ol.style.Stroke({ color: '#132FC3', width: 2 })
                                                    });
						break;
					}
					
					style = new ol.style.Style({image: _image
                                               ,zIndex: 10
                                               });
				}
				break;
			}// close
			/** Monitoraggio TPL**/
			case configuration.getParam("Constants").layersName["MONITORAGGIO_TPL"]: {
				/*
				_bearing = properties.bearing;
				_image = olStyleService.createOlStyleIcon( configuration.getParam("Constants").ContextPath 
		 				                                 + configuration.getParam("Constants").iconStyles[codeLayer]
                                                         ,[31, 46]
                                                         );
				//if(_bearing){
				//	_image.setRotation(_bearing);
				//}
              style = new ol.style.Style({image: _image
                                         ,zIndex: 20
                                         ,text: new ol.style.Text({text   : properties.routeId
                                                                  ,fill   : new ol.style.Fill({color: '#fff'})
                                                                  ,font   : 'bold italic 0.8em Arial, Verdana, Helvetica, sans-serif'
                                                                  ,offsetY: 10
                                                                 })
                                        });
                                        
              
              */
				
		    	 return MonitoraggioTplSrv.styleMezzo(properties);
				break;
			}// close
			/** Monitoraggio TPL STORICO**/
			case configuration.getParam("Constants").layersName["MONITORAGGIO_TPL_STORICO"]: {
				/*
				_bearing = properties.bearing;
				_image = olStyleService.createOlStyleIcon( configuration.getParam("Constants").ContextPath 
		 				                                 + configuration.getParam("Constants").iconStyles[codeLayer]
                                                         ,[31, 46]
                                                         );
				//if(_bearing){
				//	_image.setRotation(_bearing);
				//}
              style = new ol.style.Style({image: _image
                                         ,zIndex: 20
                                         ,text: new ol.style.Text({text   : properties.routeId
                                                                  ,fill   : new ol.style.Fill({color: '#fff'})
                                                                  ,font   : 'bold italic 0.8em Arial, Verdana, Helvetica, sans-serif'
                                                                  ,offsetY: 10
                                                                 })
                                        });
                                        */
				return MonitoraggioTplSrv.styleMezzo(properties);
				break;
			}// close
			/** TPL PERCORSI **/
			case configuration.getParam("Constants").layersName["TPL_PERCORSI"]: {
				switch (geometryType) {
					case "Point": case "MultiPoint":{
				    	style = 
				    		new ol.style.Style({
							 	image: olStyleService.createOlStyleIcon(
							 				configuration.getParam("Constants").ContextPath + 
							 				configuration.getParam("Constants").iconStyles[codeLayer], [30, 30]),
							 	zIndex: 2
				    		});
				    	break;
				    }
					case "LineString": case "MultiLineString": default: {
				    	style = 
				    		new ol.style.Style({
				    			 stroke: new ol.style.Stroke({ color: '#176BE9', width: 3 }),
				    			 zIndex: 1
							});
				        break; 
				    }
				}
				break;
			}// close
			/** REPORT_ANOMALIE **/
			case configuration.getParam("Constants").layersName["REPORT_ANOMALIE"]: {
				switch (geometryType) {
				case "Point": case "MultiPoint":{
					style = 
						new ol.style.Style({
							image: olStyleService.createOlStyleIcon(
									configuration.getParam("Constants").ContextPath + 
									configuration.getParam("Constants").iconStyles[codeLayer], [30, 30]),
									zIndex: 2
						});
					break;
				}
				case "LineString": case "MultiLineString": default: {
					style = 
						new ol.style.Style({
							stroke: new ol.style.Stroke({ color: '#176BE9', width: 3 }),
							zIndex: 1
						});
					break; 
				}
				}
				break;
			}// close

			
			default: {
				/* Ritorna un descrittore dello stile di default. */
				style = olStyleService.createStyleDefault();
				break; 
			}
		}//close switch codeLayer
		
		return style;
	}// close detectStyle
	
}]); 
